
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2008, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

#ifndef _USUL_SIGNALS_ACTIONS_H_
#define _USUL_SIGNALS_ACTIONS_H_

#include "Usul/Diagnostics/StackTrace.h"

#include <iostream>
#include <string>


namespace Usul {
namespace Signals {
namespace Actions {


///////////////////////////////////////////////////////////////////////////////
//
//  Action that prints the given message.
//
///////////////////////////////////////////////////////////////////////////////

struct PrintMessage
{
  void operator () ( const std::string &s )
  {
    std::cout << s << std::endl;
  }
};


///////////////////////////////////////////////////////////////////////////////
//
//  Action that prints the stack trace.
//
///////////////////////////////////////////////////////////////////////////////

struct PrintStackTrace
{
  void operator () ( const std::string & )
  {
    Usul::Diagnostics::StackTrace::print();
  }
};


///////////////////////////////////////////////////////////////////////////////
//
//  Action that throws.
//
///////////////////////////////////////////////////////////////////////////////

template < class ExceptionType > struct Throw
{
  void operator () ( const std::string &s )
  {
    throw ExceptionType ( s );
  }
};


///////////////////////////////////////////////////////////////////////////////
//
//  Action that aborts.
//
///////////////////////////////////////////////////////////////////////////////

struct Abort
{
  void operator () ( const std::string &s )
  {
    ::abort();
  }
};


///////////////////////////////////////////////////////////////////////////////
//
//  Action that exits.
//
///////////////////////////////////////////////////////////////////////////////

struct Exit
{
  void operator () ( const std::string &s )
  {
    ::exit ( -1 );
  }
};


///////////////////////////////////////////////////////////////////////////////
//
//  A pair of actions.
//
///////////////////////////////////////////////////////////////////////////////

template < class A, class B > struct Pair
{
  void operator () ( const std::string &s )
  {
    A a;
    B b;
    a ( s );
    b ( s );
  }
};


} // namespace Actions
} // namespace Signals
} // namespace Usul


#endif // _USUL_SIGNALS_ACTIONS_H_
